package com.jprocms.module.cms.service.sitetpl;

import com.jpro.framework.common.pojo.PageResult;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.jprocms.module.cms.api.dto.SiteDefTplDto;
import com.jprocms.module.cms.api.dto.SiteDefTplQueryDto;
import com.jprocms.module.cms.controller.admin.sitetpl.vo.SiteTplExportReqVO;
import com.jprocms.module.cms.controller.admin.sitetpl.vo.SiteTplPageReqVO;
import com.jprocms.module.cms.convert.sitetpl.SiteTplConvert;
import com.jprocms.module.cms.dal.dataobject.site.SiteDO;
import com.jprocms.module.cms.dal.dataobject.sitetpl.SiteTplDO;
import com.jprocms.module.cms.dal.mysql.site.SiteMapper;
import com.jprocms.module.cms.dal.mysql.sitetpl.SiteTplMapper;
import com.jprocms.module.cms.service.sitedetailtpl.SiteDetailTplService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;

import javax.annotation.Resource;
import java.util.Collection;
import java.util.List;

import static com.jpro.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.jprocms.module.cms.enums.ErrorCodeConstants.SITE_TPL_NOT_EXISTS;

/**
 * 站点各个发布平台的首页和列表默认模板 Service 实现类
 *
 * @author jprocms
 */
@Service
@Validated
public class SiteTplServiceImpl implements SiteTplService {

    @Resource
    private SiteTplMapper siteTplMapper;
    @Resource
    private SiteDetailTplService siteDetailTplService;
    @Resource
    private SiteMapper siteMapper;

    @Override
    public Long createSiteTpl(SiteDefTplDto createReqVO) {
        // 插入
        SiteTplDO siteTpl = SiteTplConvert.INSTANCE.convert(createReqVO);
        siteTplMapper.insert(siteTpl);
        // 返回
        return siteTpl.getId();
    }

    @Override
    public void updateSiteTpl(SiteDefTplDto updateReqVO) {
        // 更新
        SiteTplDO updateObj = SiteTplConvert.INSTANCE.convert(updateReqVO);
        siteTplMapper.updateById(updateObj);
    }

    @Transactional(rollbackFor = Exception.class)
    public void createOrUpdateSiteTpl(SiteDefTplDto siteDefTplDto) {
        SiteTplDO tplDO = selectSiteTpl(new SiteDefTplQueryDto(siteDefTplDto.getSiteId(), siteDefTplDto.getPlatformId()));
        if (tplDO.getId() != null) {
            siteDefTplDto.setId(tplDO.getId());
            updateSiteTpl(siteDefTplDto);
        } else {
            siteDefTplDto.setId(null);
            createSiteTpl(siteDefTplDto);
        }
        LambdaUpdateWrapper<SiteDO> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.eq(SiteDO::getId, siteDefTplDto.getSiteId());
        updateWrapper.set(SiteDO::getPcSolution, siteDefTplDto.getPcSolution());
        updateWrapper.set(SiteDO::getH5Solution, siteDefTplDto.getH5Solution());
        siteMapper.update(new SiteDO(), updateWrapper);
//        SiteDO siteDO = siteMapper.selectById(siteDefTplDto.getId());
//        siteDO.setPcSolution(siteDefTplDto.getPcSolution());
//        siteDO.setH5Solution(siteDefTplDto.getH5Solution());
//        siteMapper.updateById(siteDO);
        siteDetailTplService.createOrUpdateSiteDetailTpls(siteDefTplDto);
    }

    public SiteTplDO selectSiteTpl(SiteDefTplQueryDto siteDefTplDto) {
        LambdaQueryWrapper<SiteTplDO> queryWrapper = Wrappers.lambdaQuery();
        queryWrapper.eq(SiteTplDO::getSiteId, siteDefTplDto.getSiteId());
        queryWrapper.eq(SiteTplDO::getPlatformId, siteDefTplDto.getPlatformId());
        SiteTplDO siteTplDO = siteTplMapper.selectOneByNoError(queryWrapper);
        //避免未配置的站点空对象
        if (siteTplDO == null) {
            siteTplDO = new SiteTplDO(siteDefTplDto.getSiteId(), siteDefTplDto.getPlatformId().intValue());
        }
        return siteTplDO;
    }


    @Override
    public void deleteSiteTpl(Long id) {
        // 校验存在
        validateSiteTplExists(id);
        // 删除
        siteTplMapper.deleteById(id);
    }

    private void validateSiteTplExists(Long id) {
        if (siteTplMapper.selectById(id) == null) {
            throw exception(SITE_TPL_NOT_EXISTS);
        }
    }

    @Override
    public SiteTplDO getSiteTpl(Long id) {
        return siteTplMapper.selectById(id);
    }

    @Override
    public List<SiteTplDO> getSiteTplList(Collection<Long> ids) {
        return siteTplMapper.selectBatchIds(ids);
    }

    @Override
    public PageResult<SiteTplDO> getSiteTplPage(SiteTplPageReqVO pageReqVO) {
        return siteTplMapper.selectPage(pageReqVO);
    }

    @Override
    public List<SiteTplDO> getSiteTplList(SiteTplExportReqVO exportReqVO) {
        return siteTplMapper.selectList(exportReqVO);
    }

}
